AutoLayout是在iOS6之后推出的一种基于约束的,描述性的布局系统。使用约束条件来定义view的位置和尺寸。解决了不同分辨率和屏幕尺寸下view的适配问题,也简化了旋转时view位置的定义。
之前一直使用frame或第三方库Masonry布局,对约束如何实现的并不清楚,所以抽时间进行了简单学习,并记录下如何使用纯代码NSLayoutConstraint实现autoLayout。
显式创建约束方法constraintWithItem
|
view1
:要添加约束的视图attr1
:约束枚举NSLayoutAttribute
relation
:与约束值的关系,大于 等于或小于view2
:被参照对象attr2
:被参照对象所被参照的枚举值NSLayoutAttribute
multiplier
:乘数,确定间距倍数等关系(默认1.0)constant
:差值常量注:view1与view2的位置和大小约束关系满足表达式:
view1.attr1 = view2.attr2 * multiplier + constant
简单介绍下NSLayoutAttribute的枚举值:
下面通过代码来了解constraintWithItem这个方法:
注: 使用
Auto Layout
时,必须先将视图的translatesAutoresizingMaskIntoConstraints
属性设为NO。因为当它为YES时,自己添加的约束会与系统的Autoresizing Mask
约束产生冲突。
|
运行程序查看效果,也可以大致参考下图的简单说明:
使用VFL(即Visual Format Language)可视化格式语言创建约束
VFL的API
format
:VFL格式字符串opts
: 对齐方式的枚举值NSLayoutFormatOptions
metrics
:设置需要进行替换的值,是字典类型,通过下面代码加以理解views
:传入约束中用到的views,也是字典类型。注意字典中的values一定要和format参数里所写的views名字相同
部分NSLayoutFormatOptions的枚举值介绍:
下面通过代码来了解constraintsWithVisualFormat这个方法:
|
下面介绍上面代码中的标记:
① NSDictionaryOfVariableBindings(view1)
:
这是个宏定义,字典格式可以理解为 @{ @"view1" : @"view1"};
相当于将key - value进行对应绑定;因为在VFL中是通过key来寻找对应的value。比如@{@"aView" : @"self.sView"}
它会布局self.sView而不是aView。所以你在VFL中看到的变量是key,而不是value。
注:在format字符串里或是在binding字典里,都应该避免使用类似self.view1这样的字样,可以使用
_view1
。
② @"H:|-[view1]-50-|"
:
H:
表示在水平方向上添加约束(H即horizontal);
|
是表示父视图;
-
表示一个间距;如果未设置间距值,当和父视图之间时,默认代表20px(可看作-20-),如果是两个同级别的view,比如@"[view1]-[view2]"
,则表示8px;
所以这句话可理解为view1在水平方向上距父视图左边20px,距离父视图右边50px
③ @"V:|-100-[view1(==200)]"
:
V:
表示在垂直方向上添加约束(V即vertical);
[view1(==200)]
如果是在垂直方向上则表示view1的高度等200,水平方向则表示宽等某个值,可省略==
简化为[view1(200)]
;
由于确定了高度,所以底部间距不用设置,不然会起冲突。所以这句话可理解为view1在垂直方向上距父视图顶部100px,高为200px
再通过一个例子加深理解:
查看运行效果,大致如下:
相关问题
- 假如设置三个视图的宽高固定为50px,如何让三个视图在垂直方向上居中且等分所有间距?
|
思路:因为是三个视图,所以会等分四个间距,可以通过辅助视图来填充间距,且每个辅助视图的宽是相等的,然后和固定的三个视图的宽的总和等于父视图的宽。详细参考下面代码:
运行查看效果:
以上就是对NSLayoutConstraint学习做的笔记和遇到的问题,后期会在进行深入理解研究~~
本文Demo已经上传至github,在里面的AutoLayout-Notes目录下。